﻿using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Xml;
//

using GCon;
using GTipos;


public partial class CtrlCabecera : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
        // Primer metodo en ejecutarse 
        setEstado(EstadoCabecera.SinSesion);

    }
    /// <summary>
    /// Metodo que asigna memoria a los componentes del controlador
    /// </summary>
    public void InicializaElementos()
    {
        /* IDEAS NO BORRAR
         * Recuerda la idea del mapper para construir los directorios o no de la URL de navegacion mas adelante convendria desarrollarlo 
         * if (Server.MapPath() == null)
         *  {
         *  Server.MapPath = new MappingType();
         *  }
         * */

        /* IDEAS NO BORRAR
         * Relativo a la inicializacion del rotator hay instrucion que lo hacen en codigo de servidor.
         * idCarruselCabecera.DataSource = this.GetDocumento().SelectNodes("/Advertisements/Ad");
         * idCarruselCabecera.DataBind();
         * */

        /* INFORMACION:
         * Cada vez que se refresca la pagina los controladores se invocan con el metodo onLoad lo cual resetea su estado
         * esto no se puede evitar sin llenar la sesion con miles de variables que ralentizaran es sistema
         * con lo que hay que pensar en los controladores como con una serie de estados finitos para que se inicialicen una y otra 
         * vez con la misma información.
         * */

        // Primero resetamos el estado del controlador

        Resetea();

        if (_estado == EstadoCabecera.NoSesion)
        {
            /* Primer estado el mas restrictivo, no es posible relizar un login de usuario, se comportara a todos los efectos como una pagina web.
            * y de paso nos quitamos el riesgo de hackeos
            * */
            this.idBotonIniciaSesion.Enabled = false;
        }
        else
            if (_estado == EstadoCabecera.SinSesion)
            {
                /* Segundo estado es posible relizar un login de usuario, con lo que se habilitan las opciones y ruta de datos necesaria para hacer un 
                 * en el sistema y riesgo de hackeos y de ataques de flood, lo que evitaremos con control JavaScript en el cliente en la fase final de proyecto.
                 * */
                //this.idBotonIniciaSesion.Attributes.Remove("onClick");
                //this.idBotonIniciaSesion.Attributes.Add("onClick", "this.iniciaSesion()");
                this.idBotonIniciaSesion.Enabled = true;
                this.idBotonIniciaSesion.Visible = true;
                this.idBotonIniciaSesion.TabIndex = 3;
                this.idBotonIniciaSesion.Text = "iniciar sesión";
                this.idBotonIniciaSesion.CssClass = "LabelActiva";

                //this.idLabelIniciaSesion.Click += new EventHandler();

                this.idNombreUsuario.Enabled = true;
                this.idNombreUsuario.Visible = true;
                this.idNombreUsuario.Text = "sin sesión activa";
                this.idNombreUsuario.CssClass = "LabelActiva";

                // Elementos del ASP
                if (! this.IsPostBack)
                {
                    this.idInputUser.Visible = true;
                    this.idInputUser.Value = "usuario";
                    this.idInputUser.Style.Clear();
                    this.idInputUser.Style.Value = "CajaBorrada";

                    this.idInputPass.Visible = true;
                    this.idInputPass.Value = "contraseña";
                    this.idInputPass.Style.Clear();
                    this.idInputPass.Style.Value = "CajaBorrada";
                }


            }
            else
                if (_estado == EstadoCabecera.ConSesion)
                {
                    /* Tercer estado ya se ha iniciado con exito un login de usuario con lo que se mostrara sus datos de sesion en este controlador, 
                     * y el resto de la aplicacion habilitara opciones en funcion de este estado
                     * */
                    //this.idBotonIniciaSesion.Attributes.Remove("onClick");
                    //this.idBotonIniciaSesion.Attributes.Add("onClick", "this.cierraSesion()");

                    this.idBotonIniciaSesion.Enabled = true;
                    this.idBotonIniciaSesion.Visible = true;
                    this.idBotonIniciaSesion.TabIndex = 3;
                    this.idBotonIniciaSesion.Text = "cerrar la sesión";
                    this.idBotonIniciaSesion.CssClass = "LabelActiva";

                    this.idNombreUsuario.Enabled = true;
                    this.idNombreUsuario.Visible = true;
                    this.idNombreUsuario.Text = _nombreUsuario;
                    this.idNombreUsuario.CssClass = "LabelActiva";

                    // Elementos del ASP
                    this.idInputUser.Visible = false;


                    this.idInputPass.Visible = false;


                }
                else
                    if (_estado == EstadoCabecera.Oculto)
                    {
                        /* Cuarto oculta completamente el control en el navegador con lo que no sera ni visible como parte integrante de la pagina
                         * esto puede ser util
                         * */
                        this.idBotonIniciaSesion.Enabled = false;
                        this.idNombreUsuario.Enabled = true;
                    }

        this.Actualiza();

    }
    /// <summary>
    /// Método de puesta a cero en el estado del controlador
    /// </summary>
    public void Resetea()
    {
        _nombreUsuario = null;
        _pass = null;

        if (this.idBotonIniciaSesion == null)
            this.idBotonIniciaSesion = new Button();
        if (this.idNombreUsuario == null)
            this.idNombreUsuario = new Label();
        if (this.idLabelFecha == null)
            this.idLabelFecha = new Label();
        if (this.ClientScript == null)
           this.ClientScript = Page.ClientScript;
    }
    /// <summary>
    /// Metodo de actualización , redibujado , del controlador
    /// </summary>
    /// <returns></returns>
    public void Actualiza()
    {
        // mostramos la fecha que es independiente del estado del controlador
        this.idLabelFecha.CssClass = "LabelActiva";
        this.idLabelFecha.Text = this.getFecha(true);
        this.idLabelFecha.Visible = true;
    }
    protected void CarruselCabecera_AdCreated(object sender, AdCreatedEventArgs e)
    {

    }
    public EstadoCabecera getEstado()
    {
        return _estado;
    }
    public void setEstado(EstadoCabecera param)
    {
        _estado = param;
        InicializaElementos();
    }

    protected void SesionClick(object sender, EventArgs e)
    {
        if ((_estado != EstadoCabecera.Oculto) && (_estado != EstadoCabecera.NoSesion))
        {
            if (_estado == EstadoCabecera.SinSesion)
            {
                iniciaSesion();
            }
            else
            {
                cierraSesion();
            }
        }
    }
    /// <summary>
    /// Metodo que cierra la sesion
    /// </summary>
    public void cierraSesion()
    {
        this._nombreUsuario = "";
        this._pass = "";
        this.setEstado(EstadoCabecera.SinSesion);
    }
    public void iniciaSesion()
    {
        String Url = new String(' ', 25);
        Con_Usuario uno = new Con_Usuario();
        // Si el controlador ya tiene los datos del usuario
        try
        {
           _nombreUsuario = obtenValorParametro( ClientScript.GetPostBackEventReference(this.idInputUser, idInputUser.Value),3);
           _pass =  obtenValorParametro(ClientScript.GetPostBackEventReference(this.idInputPass, idInputPass.Value),3);

           // Create a new PostBackOptions object and set its properties.
           PostBackOptions myPostBackOptions = new PostBackOptions(this);

           // Add the client-side script to the HyperLink1 control.
           //HyperLink1.NavigateUrl = Page.ClientScript.GetPostBackEventReference(myPostBackOptions);

           //_nombreUsuario = ClientScript.GetType().GetField("idInputUser").ToString();
           //_pass = ClientScript.GetType().GetField(".idInputPass").ToString();

           //Page.GetPostBackClientEvent(this,"nombleU");
           //Page.GetPostBackClientEvent(this, "PassW");

           /* IDEA NO BORRAR
            * Codigo para cerrar una ventana desde el servidor mediante javascript 
            * ClientScript.RegisterClientScriptBlock(typeof(string), "kScript","window.close();", true); 
            * */

           /* IDEA NO BORRAR
            * el manejo de caracteres ocultos asociados a doPostback en Javascript
            * 
            * if (Request.Params.Get("__EVENTTARGET") == "Obj")
            * */

           if ((_nombreUsuario != null) && (_pass != null))
            {
                // y la llamada a base de datos devuelve que el usuario existe


               /* MILLET : El metodo ValidaUsuario perteneciente a Con_Usuario
                * solo casca cuando el usuario efectivamente existe y deberia hacer login correcto , curioso,
                * asi que mientras terminas el master y le echas un ojo voy a poner el booleano logindeverdad a falso
                * el login correcto voy a hacerlo de forma simulada lo que deberia de ir aqui cuando todo funcione 
                * con normalidad, para cuando el metodo funcione bien
                * */
                bool logindeverdad = false;

                if (logindeverdad)
                {
                    // codigo que prevalecere cuando funcione el logui con normalidad
                    if (uno.ValidaUsuario(_nombreUsuario, _pass))
                    {
                        Session.Add("Usuario", uno);
                        this.idNombreUsuario.Text = _nombreUsuario;
                        this.idBotonIniciaSesion.Text = "cierra sesión";
                        Url = "~/App_Interface/Paginas/LoggedIn.aspx";
                        setEstado(EstadoCabecera.ConSesion);
                    }
                    else
                    {
                        //setEstado(EstadoCabecera.SinSesion);
                        this.idNombreUsuario.Text = "el usuario o contraseña no existen";
                        Url = "~/Intro.aspx";
                    }
                }
                else
                {
                    // de momento fuerzo el loguin
                    if ((_nombreUsuario == "admin") && (_pass == "admin"))
                    {
                        Session.Add("Usuario", uno);
                        this.idNombreUsuario.Text = _nombreUsuario;
                        this.idBotonIniciaSesion.Text = "cierra sesión";
                        Url = "~/App_Interface/Paginas/Logged.aspx";
                        setEstado(EstadoCabecera.ConSesion);
                    }
                    else
                    {
                        //setEstado(EstadoCabecera.SinSesion);
                        this.idNombreUsuario.Text = "el usuario o contraseña no existen";
                        Url = "~/Intro.aspx";
                    }
                }
                
               
            }
            else
            {
                //setEstado(EstadoCabecera.SinSesion);
                this.idNombreUsuario.Text = "login incorrecto";
                Url = "~/Intro.aspx";
                ; //problem
            }
        }
        catch (Exception e)
        {   
            
            

            // con loguin normalizado
            _nombreUsuario = null;
            _pass = null;
            // para probarlo mas que nada aunque no tiene sentido aqui
            setEstado(EstadoCabecera.NoSesion);
        }

        // nos vamos a la pagina de respuesta
        Response.Redirect(Url);

    }
    /// <summary>
    /// Metodo que acorta la cadena para obtener el valor del parametro
    /// </summary>
    private String obtenValorParametro (String param, int filtro)
    {
        try
        {
            // Reinventando la rueda
            int indice = 0;
            int auxiliar = 0;
            bool arranca = false;
            string devolucion = new string(' ', 0);
            char letra = ' ';
            char buscado = '\'';
            int contador = 1;
            while (indice < param.Length)
            {
                letra = param.ElementAt(indice);
                if (arranca)
                {
                    if (letra != buscado)
                    {
                        devolucion += letra;
                        //devolucion[auxiliar] = letra;
                        auxiliar++;
                    }
                    else
                    {
                        arranca = false;
                        break;
                    }

                }
                if (letra == buscado)
                {
                    if (contador == filtro)
                    {
                    arranca = true;
                    }
                    else
                    {
                        contador ++;
                    }
                }
                indice++;
            }
            devolucion.Trim();
            return devolucion;
        }
        catch (Exception e)
        {
            // algun tipo de error leyendo o con el trim o la cadena contiene blancos.
            throw new NotSupportedException(" Algun tipo de problema en la lectura de cadena postback. ");
        }
    }

    public String getNombreUsuario()
    {
        return _nombreUsuario;
    }
    /// <summary>
    /// Metodo que permite introducir el usuario desde un origen externo
    /// </summary>
    /// <param name="nombre"></param>
    /// <param name="pass"></param>
    public void setUsuario (String nombre , String pass)
    {
        _nombreUsuario = nombre;
        _pass = pass;
    }
    private XmlDocument GetDocumento()
    {

        XmlDocument doc = new XmlDocument();
        //string physicalPath = new string ( "~/RotatorCabecera.xml".ToCharArray());
        string physicalPath = new string(" ".ToCharArray());
        physicalPath = Server.MapPath("~/RotatorCabecera.xml");

        try
        {
            doc.Load(physicalPath);
        }
        catch (Exception)
        {
            throw new NotImplementedException(" Ha ocurrido un error durante la carga ");
        }

        return doc;
    }

    public void SetUsuario(String nombre, String pass)
    {
        _nombreUsuario = nombre;
        _pass = pass;
    }
    /// <summary>
    /// Funcion que muestra la fecha actual escrita
    /// </summary>
    /// <param name="Spanish">En español o en ingles</param>
    /// <returns></returns>
    private string getFecha(bool Spanish)
    {
        String dayName = System.DateTime.Today.DayOfWeek.ToString();
        String nombreDia = new String(' ', 10);
        nombreDia = dayName.ToUpper();

        // Si queremos la fecha en español
        if (Spanish)
        {

            if (dayName.ToLower() == "monday")
                nombreDia = "Lunes";
            else
                if (dayName.ToLower() == "tuesday")
                    nombreDia = "Martes";
                else
                    if (dayName.ToLower() == "wednesday")
                        nombreDia = "Miércoles";
                    else
                        if (dayName.ToLower() == "thursday")
                            nombreDia = "Jueves";
                        else
                            if (dayName.ToLower() == "friday")
                                nombreDia = "Viernes";
                            else
                                if (dayName.ToLower() == "saturday")
                                    nombreDia = "Sábado";
                                else
                                    if (dayName.ToLower() == "sunday")
                                        nombreDia = "Domingo";
                                    else
                                    {
                                        ; //problem
                                    }
        }

        int numeroMes = System.DateTime.Today.Month;
        String nombreMes = new String(' ', 10);

        if (Spanish)
        {
            if (numeroMes == 1)
                nombreMes = "Enero";
            else
                if (numeroMes == 2)
                    nombreMes = "Febrero";
                else
                    if (numeroMes == 3)
                        nombreMes = "Marzo";
                    else
                        if (numeroMes == 4)
                            nombreMes = "Abril";
                        else
                            if (numeroMes == 5)
                                nombreMes = "Mayo";
                            else
                                if (numeroMes == 6)
                                    nombreMes = "Junio";
                                else
                                    if (numeroMes == 7)
                                        nombreMes = "Julio";
                                    else
                                        if (numeroMes == 8)
                                            nombreMes = "Agosto";
                                        else
                                            if (numeroMes == 9)
                                                nombreMes = "Septiembre";
                                            else
                                                if (numeroMes == 10)
                                                    nombreMes = "Octubre";
                                                else
                                                    if (numeroMes == 11)
                                                        nombreMes = "Noviembre";
                                                    else
                                                        if (numeroMes == 12)
                                                            nombreMes = "Diciembre";
                                                        else
                                                        {
                                                            ; //problem
                                                        }
        }
        else
        {
            if (numeroMes == 1)
                nombreMes = "January";
            else
                if (numeroMes == 2)
                    nombreMes = "February";
                else
                    if (numeroMes == 3)
                        nombreMes = "March";
                    else
                        if (numeroMes == 4)
                            nombreMes = "April";
                        else
                            if (numeroMes == 5)
                                nombreMes = "May";
                            else
                                if (numeroMes == 6)
                                    nombreMes = "June";
                                else
                                    if (numeroMes == 7)
                                        nombreMes = "July";
                                    else
                                        if (numeroMes == 8)
                                            nombreMes = "August";
                                        else
                                            if (numeroMes == 9)
                                                nombreMes = "September";
                                            else
                                                if (numeroMes == 10)
                                                    nombreMes = "October";
                                                else
                                                    if (numeroMes == 11)
                                                        nombreMes = "November";
                                                    else
                                                        if (numeroMes == 12)
                                                            nombreMes = "December";
                                                        else
                                                        {
                                                            ; //problem
                                                        }
        }

        String cadena = new String(' ', 25);

        if (Spanish)
            cadena = nombreDia + ", " + System.DateTime.Today.Day.ToString() + " de " + nombreMes + " de " + System.DateTime.Today.Year.ToString();
        else
            cadena = "On " + nombreMes + " , " + System.DateTime.Today.Day.ToString() + " of " + System.DateTime.Today.Year.ToString();

        return (cadena);
    }
    public ClientScriptManager getScript ()
    {
       return ClientScript;
    }

    public ClientScriptManager ClientScript;

    private EstadoCabecera _estado;

    private String _pass;
    private String _nombreUsuario;

}

